<?php
/**
 * Created by PhpStorm.
 * User: yuanxr
 * Date: 2018/6/10
 * Time: 上午8:34
 */

namespace Utility\Test;
use Utility\Data\Mysql;
/**********************************************************************************************************************
 * /data：用于快速获取复杂数据（比如分页和瀑布流）
 **********************************************************************************************************************/
class Data
{

    private $_Mysql;

    function __construct(){
        $this->_Mysql = new Mysql();
    }

    /**
     * waterfall
     *
     * @param array $db 数组库配置数组
     * @param integer $current 当前的页数
     * @param integer $show_item 显示的条目数
     * @param string $sql 取数据时使用的sql语句
     * @param array $params 取数据时使用的params参数数组
     * @return array 从mysql取回的数组
     */
    public function waterfall(array $db, int $current, int $show_item, string $sql, array $params)
    {

        // 将limit语句添加到sql_query中去
        $start = ($current - 1) * $show_item;
        $sql .= ' limit ' . $start . ',' . $show_item;
        
        // 返回查询结果
        return $this->_Mysql->query($db, $sql, $params);
    }
    
    /**
     * paging
     *
     * @param array $db 数组库配置数组
       * @param integer $current 当前页数
     * @param integer $show_item 每页显示的条目数
     * @param integer $show_link 每页显示的链接数
     * @param string $sql_count 用于统计总条目数的sql语句
     * @param string $sql_query 用于查询数据的sql语句
     * @param array $params 查询数据库时的参数
     * @return array 返回的数组格式如下：
     * [
     *	'current' => '当前页数（int）',
     *	'data' => '本次查询所包含的数据数组（array）',
     *	'total_item' => '符合条件的总条目数（int）',
     *	'total_page' => '符合条件的总页数（int）',
     *	'link_start' => '链接开始的页数（int）',
     *	'link_end' => '链接结束的页数（int）'
     * ]
     */
    public function paging(array $db, int $current, int $show_item, int $show_link, string $sql_count, string $sql_query, array $params)
    {
            
            // 取出总条目数，
        $stmt_count = $this->_Mysql->query($db, $sql_count, $params);
        $total_item = $stmt_count[0]['count'];
    
        // 将total_page初始化为1、data初始化为空数组
        $total_page = 1;
        $data = [];
    
        // 如果总条目数大于0，则继续向后计算。
        // 这进而需要注意的是，如果总条目数为零，则无须再向后计算，返回默认值即可
        if ($total_item > 0) {
    
                // 将limit语句添加到sql_query中去
            $start = ($current - 1) * $show_item;
            $sql_query .= ' limit ' . $start . ',' . $show_item;
                
            // 执行查询，计算总页数
            $data = $this->_Mysql->query($db, $sql_query, $params);
            $total_page = ceil($total_item / $show_item);
                
            // 为link_start, link_end赋值
            list($link_start, $link_end) = data::_paging_start_end($current, $total_page, $show_link);
        }
    
        // 返回
        return [
                'current'     => $current,
                'data'        => $data,
                'total_item'  => $total_item,
                'total_page'  => $total_page,
                'link_start'  => $link_start,
                'link_end'    => $link_end
            ];
    }
    
    /**
     * _paging_start_end
     */
    private function _paging_start_end(int $current, int $total_page, int $show_link)
    {
    
        // 如果this->show_link等于偶数，则将其加1，变为奇数
        if ($show_link % 2 == 0) {
            $show_link += 1;
        }
    
        // 定义左右之间的距离、中间分隔数字
        $apart = floor($show_link / 2);
            
        // start与end默认的值（初始化为最前面的几页），即：开始页为1，结束页为第一轮需要显示的最大页数
        $link_start = 1;
        $link_end = $total_page <= $show_link ? $total_page : $show_link;
    
        // 首先要判断，总页数是否大于需要显示的页数，如果不大于显示的页数，则直接使用link_start, link_end的默认值即可
        // 注意，link_end的默认值，即是总页数和显示页数中的大值。所以，这一句判断是将前总页数<=(小于等于)显示页数的数据全部排除掉后续计算
        if ($total_page > $show_link) {
    
                // 如果是最后几页，也就是（左右的距离数大于最大页 - 当前页）
            if (($total_page - $current) < $apart) {
                $link_start = $total_page - $show_link;
                $link_end = $total_page;
            }
                
            // 如果不是最后几页（当前也已经排除最前面几页），则直接由当前页 - 前后距离页数
            elseif ($current > $apart) {
                $link_start = $current - $apart;
                $link_end = $current + $apart;
            }
        }
    
        // 返回
        return [$link_start, $link_end];
    }
}
